/*
 * Nombre: controlador.c
 * Descripción: Interfaz mediante Puerto Paralelo a la placa PCB
 * Autor: Jorge Santiago Cruz Lambert
 * Fecha de Creación: 13 Febrero 2009
 * Versión: 1.0
 * Compilación: 'gcc -O2 -o controlador controlador.c',
 * Ejecución: En modo superusuario './controlador'.
 */

#include "controlador.h"
/*
Función: comenzar
Descripción: Esta función habilita el acceso al puerto paralelo
Requisitos: -
Parámetros: -
Devuelve: -
Autor: Jorge S. Cruz Lambert
Fecha de creación: 13 de Febrero de 2009
*/
void comenzar()
{
   if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);}
}
/*
Función: terminar
Descripción: Esta función deshabilita el acceso al puerto paralelo y resetea
Requisitos: -
Parámetros: -
Devuelve: -
Autor: Jorge S. Cruz Lambert
Fecha de creación: 13 de Febrero de 2009
*/
void terminar()
{
   //Resetea la PCB, hace una puesta a 0
   outb(0, BASEPORT);
   if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);}	
}
/*
Función: hexadecimal
Descripción: Esta función representa los números en hexadecimal
de los display. Mediante una llamada a las librerías de Unix.
Requisitos: Tener acceso al puerto paralelo.
Parámetros: 
	-num: Numero hexadecimal (0-F) a representar
	-point: 1, si se desea activar el punto del display, 0 desactivado.
Devuelve: -
Autor: Jorge S. Cruz Lambert
Fecha de creación: 13 de Febrero de 2009
*/
void hexadecimal (int num, int point)
{
    int n;
	switch(num)
	{
		case 0: n=125;
				  break;
		case 1: n= 68;
				  break;
		case 2: n=122;
				break;
		case 3: n= 110;
				break;
		case 4: n= 71;
				break;
		case 5: n=47;
				break;				
		case 6: n=63;
				break;
		case 7: n=101;
				break;
		case 8: n=127;
				break;
		case 9: n=111;
				break;				
		case 10: n=119;
				break;
		case 11: n=31;
				break;
		case 12: n=57;
				break;
		case 13: n=94;
				break;				
		case 14: n=59;
				break;
		case 15: n=51;
				break;
		default: n=127;
				break;
	}
	if(point)
		n+=128;
    //Mandar el dato a las señales de dato del puerto.
	outb(n, BASEPORT);	
}
/*
Función: seleccionDisplay
Descripción: Esta función selecciona los display a activar, mediante
las señales de control del puerto paralelo
Requisitos: Tener acceso al puerto paralelo
Parámetros: 
	-primero: Primer display, 0, deshabilitado, si es distinto de 0 habilitado
	-segundo: Segundo display, 0, deshabilitado, si es distinto de 0 habilitado
	-tercero: Tercer display, 0, deshabilitado, si es distinto de 0 habilitado
Devuelve: -
Autor: Jorge S. Cruz Lambert
Fecha de creación: 13 de Febrero de 2009
*/
void seleccionDisplay(int primero, int segundo, int tercero)
{
   int n;
   
	if(!primero)
	{
		if(segundo && tercero)
			n=2;
		else if(!segundo && !tercero)
			n=12;
		else if(!segundo)
			n=6;
	    else
	    	n=0;
	}
	else
	{
		if(segundo && tercero)
			n=11;
	    else if(!segundo && !tercero)
	    	n=13;
		else if(!segundo)
			n=15;
		else
			n=9;
	}
	//Mandar el dato a las señales de control del puerto.
	outb(n, BASEPORT+2);	
}
void leerStatus (void)
{
	  /* Lee los bits de estado del puerto paralelo y los muestra*/
  printf("status: %d\n", inb(BASEPORT + 1));
}

